home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
commoditys
/
cx13
/
txt
/
cx.mod
< prev
next >
Wrap
Text File
|
1996-04-07
|
39KB
|
1,175 lines
MODULE CX;
(* CX.mod - Ersatz für das "Exchange"-Programm der Workbench
* Version : $VER: CX.mod 1.2 (© 1994 Fin Schuppenhauer)
* Autor : Fin Schuppenhauer
* Braußpark 10
* 20537 Hamburg
* (Germany)
* E-Mail : schuppenhauer@informatik.uni-hamburg.de
* Erstellt am : 31 Aug 1994
* Letzte Änd. : 18 Sep 1994
*)
(*$ DEFINE Debug:=FALSE *)
IMPORT cd:CommoditiesD, cl:CommoditiesL, cp:CommoditiesPrivate,
cs:CommoditiesSupport,
ed:ExecD, el:ExecL, es:ExecSupport,
id:IntuitionD, il:IntuitionL, im:IntuiMacros,
gtd:GadToolsD, gtl:GadToolsL,
gd:GraphicsD, gl:GraphicsL,
dd:DosD, dl:DosL,
ld:LocaleD, ll:LocaleL,
iv:InputEvent,
ASCII,
lan:ListsAndNodes,
cxc:CXCatalog,
(*$ IF Debug *)
Arts,
t:Terminal,
(*$ ENDIF *)
str:String;
FROM SYSTEM IMPORT LONGSET, CAST, ADR, ADDRESS, TAG, BITSET;
FROM UtilityD IMPORT tagEnd;
(*$ IF Debug *)
FROM InOut IMPORT WriteCard;
(*$ ENDIF *)
CONST
(* Konstanten für die Gadgets: *)
LISTGADGET = 0; (* Die ID-Nummern der ersten drei Gadgets *)
SHOWGADGET = 1; (* dürfen nicht verändert werden! (siehe *)
HIDEGADGET = 2; (* ProcessMsg()) *)
ENABLEGADGET = 3;
KILLGADGET = 4;
DISABLEALLGADGET = 5; (* Diese zwei ID-Nummern dürfen ebenfalls *)
KILLALLGADGET = 6; (* nicht verändert werden! *)
GADGETCOUNT = 7;
(* Koordinaten der Bevelbox: *)
BEVELTOP = 25;
BEVELLEFT = 209;
BEVELWIDTH = 340;
BEVELHEIGHT = 28;
IVHOTKEY = 1;
(* Menü: *)
PROJEKT = 0;
ABOUTMENU = 0;
(* ~~~~~~~~~~~ = 1 *)
HIDEMENU = 2;
QUITMENU = 3;
EDIT = 1;
DISABLEALLMENU = 0;
ENABLEALLMENU = 1;
KILLALLMENU = 2;
(* nmEnd *)
MENUCOUNT = 10;
CONST
YSTEP = 2;
XSTEP = 4;
TYPE
StrPtr = POINTER TO ARRAY [0..127] OF CHAR;
UpperLowerCase = (lower, upper);
MyTime = RECORD
seconds, micros : LONGCARD;
END;
VAR
brokerport : ed.MsgPortPtr; (* über diesen Port läuft die gesamte Kommunikation *)
nb : cd.NewBroker;
broker : cd.CxObjPtr;
error : LONGCARD; (* für Errorcode von CxBroker() *)
cxsigflag : SHORTCARD; (* Signal bei eintreffenden Broker- oder Intuition-Msgs. *)
bool : BOOLEAN; (* dummy *)
msg : ed.MessagePtr;
defhotkey : ARRAY [0..127] OF CHAR;
hotkey : StrPtr;
hotkeyfilter: cd.CxObjPtr;
dummystr : StrPtr;
VAR
window : id.WindowPtr;
wintitle : ARRAY [0..127] OF CHAR;
winreplyport: ed.MsgPortPtr;
vi : ADDRESS;
glist : id.GadgetPtr;
gadget : ARRAY [0..GADGETCOUNT-1] OF id.GadgetPtr;
CycleLabels : POINTER TO ARRAY [0..2] OF ADDRESS;
allCycleLabels: POINTER TO ARRAY [0..2] OF ADDRESS;
menuStrip : id.MenuPtr;
topazfont : gd.TextFontPtr;
topaz8 : gd.TextAttr;
bevelWidth,
bevelHeight : INTEGER;
brokerlist : ed.ListPtr; (* Liste der Broker; wird gleichzeitig für das LV-Gadget genutzt *)
catalog : ld.CatalogPtr;
requester : BOOLEAN;
PROCEDURE CreateCommoditiesList (VAR blist : ed.ListPtr);
(** "Liste für Listview-Gadget erzeugen"
*)
VAR
li : LONGINT;
BEGIN
blist := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.public});
IF blist # NIL THEN
es.NewList (blist);
(* Kopie der System-Broker-List anlegen: *)
li := cp.CopyBrokerList (blist);
END;
lan.SortExecList (blist, INTEGER(lan.CountNodes(blist)));
END CreateCommoditiesList;
(* **)
PROCEDURE FreeCommoditiesList (VAR blist : ed.ListPtr);
(** "Gibt den durch CreateCommoditiesList() belegeten speicher frei" *)
VAR
li : LONGINT;
BEGIN
IF blist # NIL THEN
li := cp.FreeBrokerList(blist);
el.FreeMem (blist, SIZE(ed.List));
blist := NIL;
END;
END FreeCommoditiesList;
(* **)
PROCEDURE UpdateCommoditiesList (VAR blist : ed.ListPtr);
(** "Erneuert die LV-Gadget-Liste" *)
VAR
dummylistptr: ADDRESS;
li : LONGINT;
taglist : ARRAY [0..7] OF LONGINT;
BEGIN
FreeCommoditiesList (blist);
CreateCommoditiesList (blist);
dummylistptr := blist;
gtl.GTSetGadgetAttrsA (gadget[LISTGADGET], window, NIL, TAG(taglist,
gtd.gtlvLabels, dummylistptr,
tagEnd));
END UpdateCommoditiesList;
(* **)
PROCEDURE CountBrokers (blist : ed.ListPtr) : CARDINAL;
(** "Berechnet die Anzahl der angezeigten Broker" *)
VAR
node : ed.NodePtr;
count : CARDINAL;
BEGIN
RETURN CARDINAL(lan.CountNodes (blist)) - 1;
(* Bemerkung:
* In der Brokerliste gibt es einen besonderen Broker, der
* die Liste abschließt (CxObj-Type = cxZero). Den wollen
* wir natürlich nicht mitzählen.
*)
END CountBrokers;
(* **)
PROCEDURE ShowWindow;
(** "Fenster öffnen, Gadgets zeichnen u.s.w." *)
VAR
screen : id.ScreenPtr;
taglist : ARRAY [0..29] OF LONGINT;
gad : id.GadgetPtr;
ng : gtd.NewGadget;
rp : gd.RastPortPtr;
mynewmenu : POINTER TO ARRAY [0..MENUCOUNT-1] OF gtd.NewMenu;
font : gd.TextAttrPtr;
buttonHeight: INTEGER;
buttonWidth : INTEGER;
listviewTop : INTEGER;
buttonTop : INTEGER;
infostr : StrPtr;
dummy : INTEGER;
innerHeight : INTEGER;
PROCEDURE ComputeWidths(VAR bevelwidth, buttonwidth : INTEGER);
(** "Berechnet den Platz des längsten Buttons": *)
VAR
userfont : gd.TextFontPtr;
BEGIN
userfont := gl.OpenFont(screen^.font);
bevelwidth := userfont^.xSize * 44;
buttonwidth := (bevelwidth - XSTEP) DIV 2;
gl.CloseFont(userfont);
END ComputeWidths;
(* **)
PROCEDURE SetShortcutAndLabel (VAR nm : gtd.NewMenu;
localMsg : ADDRESS);
(** "Für Menü Shortcut und Labeltext setzen" *)
BEGIN
WITH nm DO
commKey := localMsg;
label := localMsg + CAST(ADDRESS, 2);
IF CAST(StrPtr, localMsg)^[0] = " " THEN
commKey := NIL;
END;
END;
END SetShortcutAndLabel;
(* **)
BEGIN
IF window # NIL THEN
(* Das Fenster ist bereist geöffnet! *)
RETURN;
END;
(* Fenster soll auf dem Default(Workbench)-Screen erscheinen: *)
screen := il.LockPubScreen (NIL);
IF screen = NIL THEN
RETURN;
END;
vi := gtl.GetVisualInfoA(screen, TAG(taglist, tagEnd));
IF vi = NIL THEN
il.UnlockPubScreen (NIL, screen);
RETURN;
END;
(** Menü-Stuff: *)
mynewmenu := el.AllocMem(MENUCOUNT*SIZE(gtd.NewMenu), ed.MemReqSet{ed.public,ed.memClear});
IF mynewmenu # NIL THEN
WITH mynewmenu^[0] DO
type := gtd.nmTitle;
label := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_MENU, ADR(cxc.MSG_PROJECT_MENUSTR));
menuFlags := BITSET{};
END;
WITH mynewmenu^[1] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[1], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_ABOUT, ADR(cxc.MSG_PROJECT_ABOUTSTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_ABOUT, ADR(cxc.MSG_PROJECT_ABOUTSTR));
commKey := ADR("?");*)
END;
WITH mynewmenu^[2] DO
type := gtd.nmItem;
label := gtd.nmBarlabel;
END;
WITH mynewmenu^[3] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[3], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_HIDE, ADR(cxc.MSG_PROJECT_HIDESTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_HIDE, ADR(cxc.MSG_PROJECT_HIDESTR));
commKey := ADR("H");*)
END;
WITH mynewmenu^[4] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[4], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_QUIT, ADR(cxc.MSG_PROJECT_QUITSTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_QUIT, ADR(cxc.MSG_PROJECT_QUITSTR));
commKey := ADR("Q");*)
END;
WITH mynewmenu^[5] DO
type := gtd.nmTitle;
label := ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_MENU, ADR(cxc.MSG_CONTROL_MENUSTR));
menuFlags := BITSET{};
END;
WITH mynewmenu^[6] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[6], ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_DISABLEALL, ADR(cxc.MSG_CONTROL_DISABLEALLSTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_DISABLEALL, ADR(cxc.MSG_CONTROL_DISABLEALLSTR));
commKey := ADR("D");*)
END;
WITH mynewmenu^[7] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[7], ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_ENABLEALL, ADR(cxc.MSG_CONTROL_ENABLEALLSTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_ENABLEALL, ADR(cxc.MSG_CONTROL_ENABLEALLSTR));
commKey := ADR("E");*)
END;
WITH mynewmenu^[8] DO
type := gtd.nmItem;
SetShortcutAndLabel (mynewmenu^[8], ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_KILLALL, ADR(cxc.MSG_CONTROL_KILLALLSTR)));
(* label := ll.GetCatalogStr(catalog, cxc.MSG_CONTROL_KILLALL, ADR(cxc.MSG_CONTROL_KILLALLSTR));
commKey := ADR("K");*)
END;
WITH mynewmenu^[9] DO
type := gtd.nmEnd;
END;
ELSE
gtl.FreeVisualInfo (vi);
il.UnlockPubScreen (NIL, screen);
RETURN;
END;
(* **)
glist := NIL;
gad := gtl.CreateContext(glist);
(* Stuff für die Font-Sensitivität: *)
font := screen^.font;
buttonHeight := font^.ySize + 4;
ComputeWidths (bevelWidth, buttonWidth);
bevelHeight := 2 * font^.ySize + 3*YSTEP + 4; (* +4 läßt das bei Topaz8 gut aussehen *)
listviewTop := 2 * font^.ySize;
buttonTop := listviewTop + bevelHeight + YSTEP;
(* Gadgets definieren: *)
(* Listview-Gadget: *)
WITH ng DO
leftEdge := 5;
topEdge := listviewTop;
width := 200;
height := bevelHeight + 3*(2+YSTEP+buttonHeight); (* 2+ weil buttonHeight nur die innere Höhe zu sein scheint *)
gadgetText:= ll.GetCatalogStr(catalog, cxc.MSG_AVAILABLECOMMODITIES_GAD, ADR(cxc.MSG_AVAILABLECOMMODITIES_GADSTR));
textAttr := font;
gadgetID := LISTGADGET;
flags := gtd.NewGadgetFlagSet{gtd.placetextAbove};
visualInfo:= vi;
userData := NIL;
END;
CreateCommoditiesList (brokerlist);
gad := gtl.CreateGadgetA(gtd.listviewKind, gad^, ng, TAG(taglist,
gtd.gtlvLabels, brokerlist,
gtd.gtlvShowSelected, NIL,
gtd.gtlvSelected, 0,
gtd.gtUnderscore, "_",
tagEnd));
gadget[LISTGADGET] := gad;
(* "Anzeige sichtbar"-Gadget: *)
WITH ng DO
leftEdge := 209;
topEdge := buttonTop;
width := buttonWidth;
height := buttonHeight;
gadgetText:= ll.GetCatalogStr(catalog, cxc.MSG_SHOWINTERFACE_GAD, ADR(cxc.MSG_SHOWINTERFACE_GADSTR));
gadgetID := SHOWGADGET;
flags := gtd.NewGadgetFlagSet{gtd.placetextIn};
END;
gad := gtl.CreateGadgetA(gtd.buttonKind, gad^, ng, TAG(taglist,
id.gaDisabled, FALSE,
gtd.gtUnderscore, "_",
tagEnd));
gadget[SHOWGADGET] := gad;
(* In-/Aktive-Cycle-Gadget: *)
CycleLabels := el.AllocMem(3*SIZE(ADDRESS), ed.MemReqSet{ed.public,ed.memClear});
IF CycleLabels # NIL THEN
CycleLabels^[0] := ll.GetCatalogStr(catalog, cxc.MSG_ACTIVE, ADR(cxc.MSG_ACTIVESTR));
CycleLabels^[1] := ll.GetCatalogStr(catalog, cxc.MSG_INACTIVE, ADR(cxc.MSG_INACTIVESTR));
CycleLabels^[2] := NIL;
WITH ng DO
topEdge := topEdge + buttonHeight + YSTEP;
gadgetText:= NIL;
gadgetID := ENABLEGADGET;
END;
gad := gtl.CreateGadgetA(gtd.cycleKind, gad^, ng, TAG(taglist,
id.gaDisabled, FALSE,
gtd.gtcyLabels, CycleLabels,
tagEnd));
gadget[ENABLEGADGET] := gad;
END;
(* "Alle deaktivieren"-Gadget: *)
allCycleLabels := el.AllocMem(3*SIZE(ADDRESS), ed.MemReqSet{ed.memClear});
IF allCycleLabels # NIL THEN
allCycleLabels^[0] := ll.GetCatalogStr(catalog, cxc.MSG_DISABLEALL, ADR(cxc.MSG_DISABLEALLSTR));
allCycleLabels^[1] := ll.GetCatalogStr(catalog, cxc.MSG_ENABLEALL, ADR(cxc.MSG_ENABLEALLSTR));
WITH ng DO
topEdge := topEdge + buttonHeight + YSTEP;
gadgetText := NIL;
gadgetID := DISABLEALLGADGET;
END;
gad := gtl.CreateGadgetA(gtd.cycleKind, gad^, ng, TAG(taglist,
gtd.gtUnderscore, "_",
gtd.gtcyLabels, allCycleLabels,
tagEnd));
gadget[DISABLEALLGADGET] := gad;
END;
(* "Anzeige verbergen"-Gadget: *)
WITH ng DO
leftEdge := leftEdge + buttonWidth + XSTEP;
topEdge := buttonTop;
gadgetText := ll.GetCatalogStr(catalog, cxc.MSG_HIDEINTERFACE_GAD, ADR(cxc.MSG_HIDEINTERFACE_GADSTR));
gadgetID := HIDEGADGET;
END;
gad := gtl.CreateGadgetA(gtd.buttonKind, gad^, ng, TAG(taglist,
id.gaDisabled, FALSE,
gtd.gtUnderscore, "_",
tagEnd));
gadget[HIDEGADGET] := gad;
(* "Entfernen"-Gadget: *)
WITH ng DO
topEdge := topEdge + buttonHeight + YSTEP;
gadgetText := ll.GetCatalogStr(catalog, cxc.MSG_REMOVE_GAD, ADR(cxc.MSG_REMOVE_GADSTR));
gadgetID := KILLGADGET;
END;
gad := gtl.CreateGadgetA(gtd.buttonKind, gad^, ng, TAG(taglist,
id.gaDisabled, FALSE,
gtd.gtUnderscore, "_",
tagEnd));
gadget[KILLGADGET] := gad;
(* "Alle entfernen"-Button: *)
WITH ng DO
topEdge := topEdge + buttonHeight + YSTEP;
gadgetText := ll.GetCatalogStr(catalog, cxc.MSG_REMOVEALL_GAD, ADR(cxc.MSG_REMOVEALL_GADSTR));
gadgetID := KILLALLGADGET;
END;
gad := gtl.CreateGadgetA(gtd.buttonKind, gad^, ng, TAG(taglist,
tagEnd));
gadget[KILLALLGADGET] := gad;
(* Fenster öffnen: *)
str.Copy (wintitle, CAST(StrPtr, ll.GetCatalogStr(catalog, cxc.MSG_WINDOWTITLE, ADR(cxc.MSG_WINDOWTITLESTR)))^);
str.Concat (wintitle, " <");
str.Concat (wintitle, hotkey^);
str.ConcatChar (wintitle, ">");
innerHeight := gadget[LISTGADGET]^.height;
dummy := bevelHeight + 3*(2+YSTEP+buttonHeight);
IF dummy > innerHeight THEN
innerHeight := dummy;
END;
INC (innerHeight, gadget[LISTGADGET]^.topEdge);
window := il.OpenWindowTagList(NIL, TAG(taglist,
id.waLeft, 20,
id.waTop, 50,
id.waGimmeZeroZero, TRUE,
id.waGadgets, glist,
id.waTitle, ADR(wintitle),
id.waDragBar, TRUE,
id.waCloseGadget, TRUE,
id.waDepthGadget, TRUE,
id.waActivate, TRUE,
id.waInnerWidth, bevelWidth + 10 + XSTEP + gadget[LISTGADGET]^.width,
id.waInnerHeight, innerHeight,
id.waPubScreen, screen,
id.waNewLookMenus, TRUE,
id.waAutoAdjust, TRUE,
tagEnd));
il.UnlockPubScreen (NIL, screen);
IF window = NIL THEN
gtl.FreeGadgets (glist);
gtl.FreeVisualInfo (vi);
RETURN;
END;
menuStrip := gtl.CreateMenusA(CAST(gtd.NewMenuPtr, mynewmenu), TAG(taglist, tagEnd));
IF menuStrip # NIL THEN
IF gtl.LayoutMenusA (menuStrip, vi, TAG(taglist,
gtd.gtmnNewLookMenus, TRUE,
tagEnd))
THEN
bool := il.SetMenuStrip (window, menuStrip);
ELSE
gtl.FreeMenus (menuStrip);
menuStrip := NIL;
END;
END;
el.FreeMem (mynewmenu, MENUCOUNT*SIZE(gtd.NewMenu));
gtl.GTRefreshWindow (window, NIL);
rp := window^.rPort;
topazfont := gl.OpenFont(font);
gl.SetFont (rp, topazfont);
infostr := ll.GetCatalogStr(catalog, cxc.MSG_INFORMATION, ADR(cxc.MSG_INFORMATIONSTR));
gl.Move (rp, BEVELLEFT + (bevelWidth DIV 2) -
(gl.TextLength(rp, infostr, str.Length(infostr^)) DIV 2),
gadget[LISTGADGET]^.topEdge - (CAST(INTEGER,
font^.ySize) DIV 2) - 2);
gl.SetAPen (rp, 1);
gl.Text (rp, infostr, str.Length(infostr^));
gtl.DrawBevelBoxA (rp, BEVELLEFT, gadget[LISTGADGET]^.topEdge, bevelWidth, bevelHeight,
TAG(taglist, gtd.gtVisualInfo, vi,
gtd.gtbbRecessed, TRUE,
tagEnd));
(* Messageport dranbasteln: *)
el.Forbid();
window^.userPort := brokerport;
(*$ IF Debug *)
il.ModifyIDCMP (window, id.IDCMPFlagSet{id.gadgetUp,
id.closeWindow, id.menuPick, id.refreshWindow, id.rawKey,
id.vanillaKey});
(*$ ELSE *)
il.ModifyIDCMP(window,
id.IDCMPFlagSet{id.closeWindow,id.menuPick,id.vanillaKey,id.refreshWindow,id.rawKey} +
gtd.listviewIDCMP +
gtd.buttonIDCMP +
gtd.cycleIDCMP);
(*$ ENDIF *)
winreplyport := window^.windowPort;
el.Permit();
END ShowWindow;
(* **)
PROCEDURE CloseWindowSafely (VAR win : id.WindowPtr);
(** siehe Reference Manual: Libraries, Seite 254f *)
PROCEDURE StripIntuiMessages (mp : ed.MsgPortPtr; win : id.WindowPtr);
VAR
msg : id.IntuiMessagePtr;
succ : ed.NodePtr;
BEGIN
msg := CAST(id.IntuiMessagePtr, mp^.msgList.head);
succ := msg^.execMessage.node.succ;
WHILE succ # NIL DO
IF msg^.idcmpWindow = win THEN
el.Remove (msg);
el.ReplyMsg (msg);
END;
msg := CAST(id.IntuiMessagePtr, succ);
succ := msg^.execMessage.node.succ;
END;
END StripIntuiMessages;
BEGIN
el.Forbid();
StripIntuiMessages (win^.userPort, win);
win^.userPort := NIL;
il.ModifyIDCMP (win, id.IDCMPFlagSet{});
el.Permit();
il.CloseWindow (win);
win := NIL;
END CloseWindowSafely;
(* **)
PROCEDURE RemoveWindow;
(** "Fenster schließen; dafür belegten Speicher freigeben" *)
BEGIN
IF window # NIL THEN
IF menuStrip # NIL THEN
il.ClearMenuStrip (window);
gtl.FreeMenus (menuStrip);
menuStrip := NIL;
END;
IF topazfont # NIL THEN
gl.CloseFont (topazfont);
topazfont := NIL;
END;
CloseWindowSafely (window);
winreplyport := NIL;
IF glist # NIL THEN
gtl.FreeGadgets (glist);
glist := NIL;
END;
IF vi # NIL THEN
gtl.FreeVisualInfo (vi);
vi := NIL;
END;
IF CycleLabels # NIL THEN
el.FreeMem (CycleLabels, 3*SIZE(ADDRESS));
CycleLabels := NIL;
END;
IF allCycleLabels # NIL THEN
el.FreeMem (allCycleLabels, 3*SIZE(ADDRESS));
allCycleLabels := NIL;
END;
IF brokerlist # NIL THEN
FreeCommoditiesList (brokerlist);
brokerlist := NIL;
END;
END;
(*$ IF Debug *)
t.WriteString ("Window removed\n");
(*$ ENDIF *)
END RemoveWindow;
(* **)
PROCEDURE ShowAbout;
(** "Zeigt den über-Reqeuster an" *)
VAR
easyreq : id.EasyStruct;
idcmp : id.IDCMPFlagSet;
num : LONGINT;
BEGIN
idcmp := id.IDCMPFlagSet{};
WITH easyreq DO
structSize := SIZE(id.EasyStruct);
flags := LONGSET{};
title := ll.GetCatalogStr(catalog, cxc.MSG_REQUEST_TITLE, ADR(cxc.MSG_REQUEST_TITLESTR));
textFormat := ll.GetCatalogStr(catalog, cxc.MSG_REQUEST_TEXT, ADR(cxc.MSG_REQUEST_TEXTSTR));
gadgetFormat:= ll.GetCatalogStr(catalog, cxc.MSG_REQUEST_GADGETS, ADR(cxc.MSG_REQUEST_GADGETSSTR));
END;
num := il.EasyRequestArgs(window, easyreq, idcmp, NIL);
END ShowAbout;
(* **)
PROCEDURE RemoveAllRequest () : BOOLEAN;
(** "Requester: Wirklich alle Commodities entfernen?" *)
VAR
easyreq : id.EasyStruct;
idcmp : id.IDCMPFlagSet;
num : LONGINT;
BEGIN
idcmp := id.IDCMPFlagSet{};
WITH easyreq DO
structSize := SIZE(id.EasyStruct);
flags := LONGSET{};
title := ll.GetCatalogStr(catalog, cxc.MSG_REMOVEALL_GAD, ADR(cxc.MSG_REMOVEALL_GADSTR));
textFormat := ll.GetCatalogStr(catalog, cxc.MSG_REQUEST_REMOVEALLTEXT, ADR(cxc.MSG_REQUEST_REMOVEALLTEXTSTR));
gadgetFormat:= ll.GetCatalogStr(catalog, cxc.MSG_REQUEST_REMOVEALL_GAD, ADR(cxc.MSG_REQUEST_REMOVEALL_GADSTR));
END;
num := il.EasyRequestArgs(window, easyreq, idcmp, NIL);
RETURN num = 1;
END RemoveAllRequest;
(* **)
PROCEDURE GetBrokerNode (item : CARDINAL) : cp.BrokerCopyPtr;
(** "BrockerCopyPtr zum gewählten Item ermitteln" *)
VAR
node : ed.NodePtr;
BEGIN
node := brokerlist^.head;
WHILE (node # NIL) & (item > 0) DO
node := node^.succ;
DEC (item);
END;
RETURN CAST(cp.BrokerCopyPtr, node);
END GetBrokerNode;
(* **)
PROCEDURE ShowInformation (item : CARDINAL);
(** "Name und Beschreibung des gewählten Brokers anzeigen" *)
VAR
brokernode : cp.BrokerCopyPtr;
rp : gd.RastPortPtr;
baseline : INTEGER;
ysize : INTEGER;
BEGIN
baseline := CAST(INTEGER, window^.rPort^.font^.baseline);
ysize := CAST(INTEGER, window^.rPort^.font^.ySize);
brokernode := GetBrokerNode (item);
rp := window^.rPort;
gl.SetAPen (rp, 0);
gl.RectFill (rp, BEVELLEFT+2, gadget[LISTGADGET]^.topEdge+2,
BEVELLEFT+bevelWidth-4, gadget[LISTGADGET]^.topEdge+bevelHeight-3);
gl.SetAPen (rp, 1);
gl.Move (rp, BEVELLEFT+XSTEP, gadget[LISTGADGET]^.topEdge + baseline + YSTEP + 1);
gl.Text (rp, ADR(brokernode^.title), str.Length(brokernode^.title));
gl.Move (rp, BEVELLEFT+XSTEP, gadget[LISTGADGET]^.topEdge + baseline + 2*YSTEP + ysize + 2);
gl.Text (rp, ADR(brokernode^.descr), str.Length(brokernode^.descr));
END ShowInformation;
(* **)
PROCEDURE UpdateGadgets (item : CARDINAL);
(** "Gadgets neu zeichnen" *)
VAR
brokernode : cp.BrokerCopyPtr;
disable : BOOLEAN;
taglist : ARRAY [0..7] OF LONGINT;
BEGIN
brokernode := GetBrokerNode(item);
disable := NOT(cp.showhide IN brokernode^.flags);
gtl.GTSetGadgetAttrsA (gadget[SHOWGADGET], window, NIL, TAG(taglist,
id.gaDisabled, disable,
tagEnd));
gtl.GTSetGadgetAttrsA (gadget[HIDEGADGET], window, NIL, TAG(taglist,
id.gaDisabled, disable,
tagEnd));
IF cp.active IN brokernode^.flags THEN
gtl.GTSetGadgetAttrsA (gadget[ENABLEGADGET], window, NIL, TAG(taglist,
gtd.gtcyActive, 0,
tagEnd));
ELSE
gtl.GTSetGadgetAttrsA (gadget[ENABLEGADGET], window, NIL, TAG(taglist,
gtd.gtcyActive, 1,
tagEnd));
END;
END UpdateGadgets;
(* **)
PROCEDURE UpdateLV (item : CARDINAL);
(** "List-Gadget aktualisieren" *)
VAR
taglist : ARRAY [0..3] OF LONGINT;
BEGIN
gtl.GTSetGadgetAttrsA (gadget[LISTGADGET], window, NIL, TAG(taglist,
gtd.gtlvSelected, item,
tagEnd));
ShowInformation (item);
UpdateGadgets (item);
END UpdateLV;
(* **)
PROCEDURE MoreToUpdate (VAR item, maxitems : CARDINAL);
BEGIN
maxitems := CountBrokers(brokerlist);
IF item > maxitems THEN
item := maxitems;
END;
UpdateLV (item);
END MoreToUpdate;
PROCEDURE SendBrokerCommand (item : CARDINAL; command : LONGCARD);
(** "Broker-Kommando verschicken" *)
VAR
brokernode : cp.BrokerCopyPtr;
li : LONGINT;
BEGIN
brokernode := GetBrokerNode(item);
IF brokernode # NIL THEN
IF cp.BrokerCommand(brokernode^.node.name, command) # cd.cmdeOk THEN
UpdateGadgets (item);
END;
END;
END SendBrokerCommand;
(* **)
PROCEDURE EnableDisable (item : CARDINAL);
(** "De-/Aktiviert das gewählte Commodity" *)
VAR
brokernode : cp.BrokerCopyPtr;
BEGIN
brokernode := GetBrokerNode(item);
IF cp.active IN brokernode^.flags THEN
SendBrokerCommand (item, cd.cxcmdDisable);
ELSE
SendBrokerCommand (item, cd.cxcmdEnable);
END;
END EnableDisable;
(* **)
PROCEDURE TellAllBrokers (command : CARDINAL);
(** "Broker-Kommando an alle Broker verschicken" *)
VAR
node : ed.NodePtr;
li : LONGINT;
BEGIN
node := brokerlist^.head;
WHILE node # NIL DO
li := cp.BrokerCommand(node^.name, command);
node := node^.succ;
END;
END TellAllBrokers;
(* **)
PROCEDURE DisableAll (VAR state : BOOLEAN);
(** "Alle Commodities de-/aktiviren" *)
VAR
taglist: ARRAY [0..3] OF LONGINT;
BEGIN
IF state THEN
TellAllBrokers (cd.cxcmdDisable);
gtl.GTSetGadgetAttrsA (gadget[DISABLEALLGADGET], window, NIL, TAG(taglist,
gtd.gtcyActive, 1, tagEnd));
ELSE
TellAllBrokers (cd.cxcmdEnable);
gtl.GTSetGadgetAttrsA (gadget[DISABLEALLGADGET], window, NIL, TAG(taglist,
gtd.gtcyActive, 0, tagEnd));
END;
state := NOT(state);
END DisableAll;
(* **)
PROCEDURE ProcessMsg;
(** "Hauptschleife"
* Hier werden alle eintreffenden Nachrichten ausgewertet.
*)
VAR
done : BOOLEAN;
(* Message-Stuff: *)
waitsignals : LONGSET;
sigrcvd : LONGSET;
msg : ed.MessagePtr;
(* Broker-Message-Stuff: *)
msgid : LONGINT;
msgtype : LONGCARD;
(* Intuition-Message-Kram: *)
gtmsg : id.IntuiMessagePtr;
class : id.IDCMPFlagSet;
gad : id.GadgetPtr;
code : CARDINAL;
qualifier : iv.QualifierSet;
time : MyTime;
selectedbroker : CARDINAL; (* gewählter Broker *)
maxbroker : CARDINAL; (* Anzahl der Broker im LV-Gadget *)
kcs : StrPtr;
disableall : BOOLEAN; (* TRUE, wenn "Alle deaktivierem", bei "Alle aktivieren" FALSE *)
taglist : ARRAY [0..7] OF LONGINT;
c : CARDINAL;
ch : CHAR;
BEGIN
kcs := CAST(StrPtr, ll.GetCatalogStr(catalog, cxc.MSG_KEYCODE, ADR(cxc.MSG_KEYCODESTR)));
disableall := TRUE;
IF window # NIL THEN
maxbroker := CountBrokers(brokerlist);
END;
selectedbroker := 0;
done := FALSE;
waitsignals := LONGSET{cxsigflag,dd.ctrlC};
WHILE NOT(done) DO
(*$ IF Debug *)
t.WriteString ("waiting...\n");
(*$ ENDIF *)
sigrcvd := el.Wait(waitsignals);
(*$ IF Debug *)
t.WriteString ("rcvdSigs = ");
WriteCard (CAST(LONGCARD, sigrcvd),0); t.WriteLn;
(*$ ENDIF *)
LOOP
msg := el.GetMsg(brokerport);
IF msg = NIL THEN
EXIT;
END;
IF msg^.replyPort = winreplyport THEN
(* Empfangene Nachricht stammt von Intuition *)
(*$ IF Debug *)
t.WriteString (" Intuition Message rcvd\n");
(*$ ENDIF *)
gtmsg := gtl.GTFilterIMsg (CAST(id.IntuiMessagePtr, msg));
IF gtmsg # NIL THEN
class := gtmsg^.class;
gad := gtmsg^.iAddress;
code := gtmsg^.code;
qualifier := gtmsg^.qualifier;
msg := CAST(ed.MessagePtr, gtl.GTPostFilterIMsg(gtmsg));
el.ReplyMsg (msg);
IF id.gadgetUp IN class THEN
(*$ IF Debug *)
t.WriteString (" gadgetUp\n");
(*$ ENDIF *)
CASE gad^.gadgetID OF
LISTGADGET:
selectedbroker := code;
ShowInformation (selectedbroker);
UpdateGadgets (selectedbroker);
IF il.DoubleClick (time.seconds, time.micros, gtmsg^.seconds, gtmsg^.micros) THEN
SendBrokerCommand (selectedbroker, cd.cxcmdAppear);
END;
time.seconds := gtmsg^.seconds;
time.micros := gtmsg^.micros;
| SHOWGADGET:
SendBrokerCommand (selectedbroker, cd.cxcmdAppear);
| HIDEGADGET:
SendBrokerCommand (selectedbroker, cd.cxcmdDisappear);
| ENABLEGADGET:
EnableDisable (selectedbroker);
| DISABLEALLGADGET:
DisableAll (disableall);
| KILLGADGET:
SendBrokerCommand (selectedbroker, cd.cxcmdKill);
| KILLALLGADGET:
IF NOT(requester) OR RemoveAllRequest() THEN
TellAllBrokers (cd.cxcmdKill);
END;
ELSE
(* unbekannte gadgetID *)
END;
ELSIF id.closeWindow IN class THEN
(*$ IF Debug *)
t.WriteString (" closeWindow\n");
(*$ ENDIF *)
RemoveWindow;
ELSIF id.menuPick IN class THEN
(*$ IF Debug *)
t.WriteString (" menuPick\n");
(*$ ENDIF *)
CASE im.MenuNum(code) OF
PROJEKT:
CASE im.ItemNum(code) OF
ABOUTMENU: ShowAbout;
| HIDEMENU: RemoveWindow;
| QUITMENU: done := TRUE;
ELSE
END;
| EDIT:
CASE im.ItemNum(code) OF
DISABLEALLMENU: TellAllBrokers (cd.cxcmdDisable);
| ENABLEALLMENU: TellAllBrokers (cd.cxcmdEnable);
| KILLALLMENU:
IF NOT(requester) OR RemoveAllRequest() THEN
TellAllBrokers (cd.cxcmdKill);
END;
ELSE
END;
ELSE
END;
ELSIF id.vanillaKey IN class THEN
ch := CHAR(code);
(*$ IF Debug *)
t.WriteString (" vanillaKey = ");
t.Write (ch); t.WriteLn;
(*$ ENDIF *)
IF (ch = kcs^[0]) OR (ch = kcs^[1]) THEN
SendBrokerCommand (selectedbroker, cd.cxcmdAppear);
ELSIF (ch = kcs^[2]) OR (ch = kcs^[3]) THEN
SendBrokerCommand (selectedbroker, cd.cxcmdDisappear);
ELSIF (ch = kcs^[4]) OR (ch = kcs^[5]) THEN
SendBrokerCommand (selectedbroker, cd.cxcmdKill);
ELSIF (ch = kcs^[6]) OR (ch = kcs^[7]) THEN
DisableAll (disableall);
ELSIF ch = kcs^[8] THEN
IF selectedbroker < maxbroker THEN
INC (selectedbroker);
UpdateLV (selectedbroker);
END;
ELSIF ch = kcs^[9] THEN
IF selectedbroker > 0 THEN
DEC (selectedbroker);
UpdateLV (selectedbroker);
END;
ELSIF (ch = kcs^[10]) OR (ch = kcs^[11]) THEN
EnableDisable (selectedbroker);
(* Besondere Zeichen: *)
ELSIF ch = ASCII.cr THEN
SendBrokerCommand (selectedbroker, cd.cxcmdAppear);
ELSIF ch = ASCII.esc THEN
RemoveWindow;
END;
ELSIF id.rawKey IN class THEN
(*$ IF Debug *)
t.WriteString (" rawKey\n");
(*$ ENDIF *)
(* Cursorbewegungen: *)
IF code = id.cursorUp THEN
IF (iv.lShift IN qualifier) OR
(iv.rShift IN qualifier) THEN
selectedbroker := 0;
ELSE
IF selectedbroker = 0 THEN
selectedbroker := maxbroker;
ELSE
DEC (selectedbroker);
END;
END;
UpdateLV (selectedbroker);
ELSIF code = id.cursorDown THEN
IF (iv.lShift IN qualifier) OR (iv.rShift IN qualifier) THEN
selectedbroker := maxbroker;
ELSE
selectedbroker := (selectedbroker+1) MOD (maxbroker+1);
END;
UpdateLV (selectedbroker);
END;
ELSIF id.refreshWindow IN class THEN
(*$ IF Debug *)
t.WriteString (" refreshWindow\n");
(*$ ENDIF *)
gtl.GTBeginRefresh (window);
gtl.GTEndRefresh (window, TRUE);
ELSE
(*$ IF Debug *)
t.WriteString (" other Intui Msg\n");
(*$ ENDIF *)
(* nicht erwartete/interessante IntuiMessage *)
END;
ELSE
(* Ist zwar eine Intui-Nachricht; diese wurde aber
* von den GadTools-Gadgets geschluckt -> nur
* beantworten: *)
el.ReplyMsg (msg);
END;
ELSE
(* Broker-Message empfangen. *)
(*$ IF Debug *)
t.WriteString (" Broker Msg\n");
(*$ ENDIF *)
msgid := cl.CxMsgID(CAST(cd.CxMsgPtr, msg));
msgtype := cl.CxMsgType(CAST(cd.CxMsgPtr, msg));
el.ReplyMsg (msg);
CASE msgtype OF
cd.cxmIevent:
(*$ IF Debug *)
t.WriteString (" cxmIevent\n");
(*$ ENDIF *)
CASE msgid OF
IVHOTKEY:
(*$ IF Debug *)
t.WriteString (" IVHOTKEY\n");
(*$ ENDIF *)
ShowWindow;
MoreToUpdate (selectedbroker, maxbroker);
ELSE
(*$ IF Debug *)
t.WriteString (" Unknown Ievent\n");
(*$ ENDIF *)
END;
| cd.cxmCommand:
(*$ IF Debug *)
t.WriteString (" cxmCommand = ");
(*$ ENDIF *)
CASE msgid OF
cd.cxcmdDisable:
(*$ IF Debug *)
t.WriteString ("Disable\n");
(*$ ENDIF *)
bool := cl.ActivateCxObj(broker, FALSE);
| cd.cxcmdEnable:
(*$ IF Debug *)
t.WriteString ("Enable\n");
(*$ ENDIF *)
bool := cl.ActivateCxObj(broker, TRUE);
| cd.cxcmdKill:
(*$ IF Debug *)
t.WriteString ("Kill\n");
(*$ ENDIF *)
done := TRUE;
| cd.cxcmdAppear:
(*$ IF Debug *)
t.WriteString ("Appear\n");
(*$ ENDIF *)
ShowWindow;
MoreToUpdate (selectedbroker, maxbroker);
| cd.cxcmdDisappear:
(*$ IF Debug *)
t.WriteString ("Disappear\n");
(*$ ENDIF *)
RemoveWindow;
| cd.cxcmdListChg:
(*$ IF Debug *)
t.WriteString ("LstChg\n");
(*$ ENDIF *)
IF window # NIL THEN
(*$ IF Debug *)
t.WriteString (" window # NIL\n");
(*$ ENDIF *)
UpdateCommoditiesList (brokerlist);
maxbroker := CountBrokers(brokerlist);
IF selectedbroker > maxbroker THEN
selectedbroker := maxbroker;
gtl.GTSetGadgetAttrsA(gadget[LISTGADGET],
window, NIL, TAG(taglist,
gtd.gtlvSelected, selectedbroker,
tagEnd));
END;
ShowInformation (selectedbroker);
UpdateGadgets (selectedbroker);
END;
| cd.cxcmdUnique:
(*$ IF Debug *)
t.WriteString ("Unique\n");
(*$ ENDIF *)
ShowWindow;
MoreToUpdate (selectedbroker, maxbroker);
ELSE
(*$ IF Debug *)
t.WriteString ("Unknown\n");
(*$ ENDIF *)
END;
ELSE
(*$ IF Debug *)
t.WriteString ("Other Broker.\n");
(*$ ENDIF *)
END;
END;
END;
IF dd.ctrlC IN sigrcvd THEN
(*$ IF Debug *)
t.WriteString (" CTRL-C\n");
(*$ ENDIF *)
done := TRUE;
END;
END;
END ProcessMsg;
(* **)
VAR
taglist: ARRAY [0..3] OF LONGINT;
BEGIN (* main *)
catalog := ll.OpenCatalogA (NIL, ADR("CX.catalog"), TAG(taglist,
ld.ocBuiltInLanguage, ADR("english"),
tagEnd));
brokerport := el.CreateMsgPort();
IF brokerport # NIL THEN
WITH nb DO
version := cd.nbVersion;
name := ADR("Exchange");
(* ^^^^^^^^ *)
(* Wichtig! Nur ein Broker mit diesem Namen *)
(* kann die wichtigen cxcmdListChg-Kommandos *)
(* empfangen. *)
title := ADR("CX V1.3 © 1994 Fin Schuppenhauer");
descr := ll.GetCatalogStr(catalog, cxc.MSG_BROKERDESCR, ADR(cxc.MSG_BROKERDESCRSTR));
port := brokerport;
unique := cd.UniqueFlagSet{cd.unique, cd.notify};
flags := cd.NewBrokerFlagSet{cd.showHide};
pri := cs.ArgInt(ADR("CX_PRIORITY"), 0);
END;
broker := cl.CxBroker(nb, error);
IF error = cd.cberrOk THEN
defhotkey := "control alt help";
hotkey := cs.ArgString(ADR("CX_POPKEY"), ADR(defhotkey));
hotkeyfilter := cs.HotKey(hotkey, brokerport, IVHOTKEY);
IF hotkeyfilter # NIL THEN
cl.AttachCxObj (broker, hotkeyfilter);
END;
cxsigflag := brokerport^.sigBit;
bool := cl.ActivateCxObj (broker, TRUE);
(* Sollen Abfrage-Requester angezeigt werden? *)
dummystr := cs.ArgString(ADR("REQUESTER"), ADR("NO"));
requester := (str.Compare(dummystr^, "YES") = 0);
dummystr := cs.ArgString(ADR("CX_POPUP"), ADR("YES"));
IF str.Compare(dummystr^, "YES") = 0 THEN
ShowWindow;
END;
ProcessMsg;
RemoveWindow;
cl.DeleteCxObjAll(broker);
(* Ausstehende Nachrichten beantworten: *)
LOOP
msg := el.GetMsg(brokerport);
IF msg = NIL THEN EXIT; END;
el.ReplyMsg(msg);
END;
END;
es.DeletePort (brokerport);
END;
ll.CloseCatalog (catalog);
END CX.